package com.winning.emr.base.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author chensj
 * @title
 * @email chensj@winning.com.cn
 * @package com.winning.hic.base.utils
 * @date: 2018-12-13 11:42
 */
public class EmrContentUtils {
    /*========================常量===========================================================*/
    /**
     * node节点元素标签
     */
    private static final String TAG_TYPE_NODE = "node";
    /**
     * Ref节点元素标签
     */
    private static final String TAG_TYPE_REF = "Ref";
    /**
     * value 属性名称
     */
    private static final String VALUE_ATTR_NAME = "value";
    /**
     * text 属性名称
     */
    private static final String TEXT_ATTR_NAME = "text";
    /**
     * name 属性名称
     */
    private static final String NAME_ATTR_NAME = "name";
    /**
     * refid 属性名称
     */
    private static final String REFID_ATTR_NAME = "refid";
    /**
     * nodetype 属性名称
     */
    private static final String NODETYPE_ATTR_NAME = "nodetype";
    /**
     * atomtype 属性名称
     */
    private static final String ATOMTYPE_ATTR_NAME = "atomtype";
    /**
     * id 属性名称
     */
    private static final String ID_ATTR_NAME = "id";
    /**
     * unit 属性名称
     */
    private static final String UNIT_ATTR_NAME = "unit";
    /**
     * display 属性名称
     */
    public static final String DISPLAY_ATTR_NAME = "display";
    /**
     * visiable 属性名称
     */
    public static final String VISIABLE_ATTR_NAME = "visiable";
    /**
     * 节点类型 文件结构
     */
    public static final String NODE_TYPE_DYNAMIC_MOLE_VALUE = "DynamicMoleNode";
    /**
     * 节点类型 文本
     */
    public static final String NODE_TYPE_TEXT_VALUE = "Text";
    /**
     * 节点类型 嵌入节点/基础模板
     */
    public static final String NODE_TYPE_EMBEDED_VALUE = "Embeded";
    /**
     * 节点类型 对象节点/元数据
     */
    public static final String NODE_TYPE_OBJECT_VALUE = "Object";
    /**
     * 节点类型 原子节点
     */
    public static final String NODE_TYPE_ATOM_NODE_VALUE = "AtomNode";
    public static final String NODE_TYPE_ATOM_NODE_DYNAMIC_VALUE = "Dynamic";
    public static final String ATOM_TYPE_STRING = "String";
    public static final String ATOM_TYPE_CHECK = "Check";

    /*========================公共方法===========================================================*/

    public static void main(String[] args) {

        System.out.println(System.getProperty("user.dir"));
        InputStream is = EmrContentUtils.class.getClassLoader().getResourceAsStream("xml/24h-rcyjl.xml");

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String value = "";
        StringBuilder content  = new StringBuilder();
        try {
            while ( ( value = reader.readLine()) != null){
                content.append(value);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(content);
        System.out.println(getEmrContent(content.toString()));
    }

    /**
     * 病历xml解析内容解析
     *
     * @param xmlContent
     * @return
     */
    public static String getEmrContent(String xmlContent) {
        StringBuilder content = new StringBuilder();
        Document document = null;
        try {
            document = DocumentHelper.parseText(xmlContent);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //获取根节点
        Element root = document.getRootElement();
        //文件结构节点集合
        List<Element> dynamicModelList = root.elements(TAG_TYPE_NODE);
        //Ref节点集合
        List<Element> refModelList = root.elements(TAG_TYPE_REF);
        //Ref节点Map
        Map<String, Element> refMap = new HashMap<>();
        for (Element element : refModelList) {
            refMap.put(element.attributeValue(ID_ATTR_NAME), element);
        }
        //获取文件结构或者DynamicMoleNode
        for (Element element : dynamicModelList) {
            content.append(getDynamicMoleValue(element, refMap));
        }

        return content.toString();
    }

    /**
     * 文件结构节点数据获取
     * display=`10``
     * 第一位：是否显示名称  0 1 2 显示样式
     * 0  DisplayDynamic
     * 1  DisplayNone
     * 2  DisplayStatic
     * 第二位：是否显示后缀  0 true 1 false
     *
     * @param element
     * @param refMap
     * @return
     */
    public static String getDynamicMoleValue(Element element, Map<String, Element> refMap) {
        StringBuilder value = new StringBuilder();
        //获取文件结构节点下全部节点
        List<Element> childList = element.elements(TAG_TYPE_NODE);
        //节点是否显示
        String visiable = element.attribute(VISIABLE_ATTR_NAME) == null ? null : element.attribute(VISIABLE_ATTR_NAME).getValue();
        if (!StringUtil.isEmptyOrNull(visiable)) {
            return value.toString();
        }
        String display = element.attribute(DISPLAY_ATTR_NAME).getValue();
        if (display.startsWith("20")) {
            value.append(display.split("`")[1]);
        }
        for (Element ch : childList) {
            //文本节点
            if (NODE_TYPE_TEXT_VALUE.equals(ch.attributeValue(NODETYPE_ATTR_NAME))) {
                value.append(getTextValue(ch));
            } else { //切入模板
                value.append(getRefNodeValue(refMap.get(ch.attributeValue(REFID_ATTR_NAME))));
            }
        }
        System.out.println(value);
        return value.toString();
    }

    /**
     * 嵌入模板节点数据获取
     * display=`10``
     * 第一位：是否显示名称  0 1 2 显示样式
     * 0  DisplayDynamic
     * 1  DisplayNone
     * 2  DisplayStatic
     * 第二位：是否显示后缀  0 true 1 false
     *
     * @param element
     * @return
     */
    public static String getRefNodeValue(Element element) {
        StringBuilder value = new StringBuilder();
        Element embeded = element.element(TAG_TYPE_NODE);
        //节点是否显示
        String visiable = embeded.attribute(VISIABLE_ATTR_NAME) == null ? null : embeded.attribute(VISIABLE_ATTR_NAME).getValue();
        if (!StringUtil.isEmptyOrNull(visiable) || "False".equals(visiable)) {
            return value.toString();
        }
        value.append(getEmbededNodeValue(embeded));
        return value.toString();
    }

    /**
     * 基础模板节点数据获取
     * display=`10``
     * 第一位：是否显示名称  0 1 2 显示样式
     * 0  DisplayDynamic
     * 1  DisplayNone
     * 2  DisplayStatic
     * 第二位：是否显示后缀  0 true 1 false
     *
     * @param element
     * @return value
     */
    public static String getEmbededNodeValue(Element element) {
        StringBuilder value = new StringBuilder();
        //节点是否显示
        String visiable = element.attribute(VISIABLE_ATTR_NAME) == null ? null : element.attribute(VISIABLE_ATTR_NAME).getValue();
        if (!StringUtil.isEmptyOrNull(visiable) || "False".equals(visiable)) {
            return value.toString();
        }
        List<Element> objectElementList = element.elements(TAG_TYPE_NODE);
        for (Element ch : objectElementList) {
            if (NODE_TYPE_TEXT_VALUE.equals(ch.attributeValue(NODETYPE_ATTR_NAME))) {
                value.append(getTextValue(ch));
            } else { //切入模板
                value.append(getObjectNodeValue(ch));
            }
        }
        return value.toString();
    }

    /**
     * 元数据节点数据获取
     * display=`10``
     * 第一位：是否显示名称  0 1 2 显示样式
     * 0  DisplayDynamic
     * 1  DisplayNone
     * 2  DisplayStatic
     * 第二位：是否显示后缀  0 true 1 false
     *
     * @param element
     * @return value
     */
    public static String getObjectNodeValue(Element element) {
        StringBuilder value = new StringBuilder();
        //节点是否显示
        String visiable = element.attribute(VISIABLE_ATTR_NAME) == null ? null : element.attribute(VISIABLE_ATTR_NAME).getValue();
        if (!StringUtil.isEmptyOrNull(visiable) || "False".equals(visiable)) {
            return value.toString();
        }
        List<Element> objectElementList = element.elements(TAG_TYPE_NODE);
        for (Element ch : objectElementList) {
            if (NODE_TYPE_TEXT_VALUE.equals(ch.attributeValue(NODETYPE_ATTR_NAME))) {
                value.append(getTextValue(ch));
            } else { //切入模板
                value.append(getAtomtypeNodeValue(ch));
            }
        }
        //System.out.println(value);
        return value.toString();
    }

    /**
     * 原子节点数据获取
     * display="2011111`姓    名：``````0"
     * 第一位：是否显示名称  0 1 2 显示样式
     * 0  DisplayDynamic
     * 1  DisplayNone
     * 2  DisplayStatic
     * 第二位：是否显示分隔符 0 true 1 false
     * 第三位：是否显示节点值 0 true 1 false
     * 第四位：是否显示后缀 0 true 1 false
     * 第五位：是否指定格式显示  0 true 1 false
     * 第六位：是否多选添加分隔符 0 true 1 false
     * 第七位：打印预览是否展示：0 true 1 false
     *
     * @param element
     * @return value
     */
    public static String getAtomtypeNodeValue(Element element) {
        StringBuilder value = new StringBuilder();
        //节点是否显示
        String visiable = element.attribute(VISIABLE_ATTR_NAME) == null ? null : element.attribute(VISIABLE_ATTR_NAME).getValue();
        if (!StringUtil.isEmptyOrNull(visiable) || "False".equals(visiable)) {
            return value.toString();
        }
        String display = element.attribute(DISPLAY_ATTR_NAME).getValue();
        String valueAttr = element.attribute(VALUE_ATTR_NAME).getValue();
        String[] splitDisplay = display.split("`");
        for (int i = 0; i < splitDisplay[0].length(); i++) {
            Character s = splitDisplay[0].charAt(i);
            Character o = new Character('0');
            if (s.equals(o)) {
                value.append(valueAttr.split("`")[1] + splitDisplay[i + 1] + "||");
            }
        }

        if (display.startsWith("20")) {
            value.append(display.split("`")[1] + "||");
        } else if (display.startsWith("21")) {
            value.append(display.split("`")[1] + "||");
        } else if (display.startsWith("11")) {
            value.append(display.split("`")[1] + "||");
        }

//        String test = "";
//        String[] split_display = display.split("`");
//        for (int i = 0; i < split_display[0].length(); i++) {
//            Character s = split_display[0].charAt(i);
//            Character o = new Character('0');
//            if (s.equals(o) && i <= 2) {
//                test = split_display[i + 1] + value;
//            } else if (s.equals(o) && i > 2) {
//                if (StringUtils.isEmpty(value.toString())) {
//                } else {
//                    test = value + split_display[i + 1];
//                }
//            }
//        }
        System.out.println(value);
        String atomValue = element.attribute(VALUE_ATTR_NAME).getValue();

        value.append(atomValue.split("`")[0] + "||");
//        value.append(atomValue.split("`")[1] + SplitParamsConstants.SPECIAL_SPLIT_FLAG);
        return value.toString();
    }

    /**
     * 文本节点数据获取
     *
     * @param element
     * @return value
     */
    public static String getTextValue(Element element) {
        StringBuilder value = new StringBuilder();
        value.append(element.attribute(TEXT_ATTR_NAME) == null ? "" : element.attribute(TEXT_ATTR_NAME).getValue());
        return value.toString();
    }
}
